home *** CD-ROM | disk | FTP | other *** search
/ Night Owl 6 / Night Owl's Shareware - PDSI-006 - Night Owl Corp (1990).iso / 031a / bankma.zip / BANKTRN.PAS < prev    next >
Pascal/Delphi Source File  |  1991-08-19  |  22KB  |  867 lines

  1. { ----------------------------------------------------------------------- }
  2. { Source file: BANKTRN.PAS                                                }
  3. { Application: Bank Manager                                               }
  4. { Version    : 1.0                                                        }
  5. { Created    : 08/19/91                                                   }
  6. { Updates    :                                                            }
  7. {                                                                         }
  8. { Description: Maintain account transaction records.                      }
  9. { Notes      :                                                            }
  10. { ----------------------------------------------------------------------- }
  11. Unit Banktrn;
  12.  
  13. {$R BANKTRN.RES}
  14.  
  15. interface
  16.  
  17. uses
  18.   Strings, WinTypes, WinProcs, WObjects, WinDOS;
  19.  
  20. type
  21.   AccRec =
  22.     record
  23.       AccType : array[0..12] of char;
  24.       AccNum  : array[0..20] of char;
  25.       AccBal  : real;
  26.       AccBank : array[0..18] of char;
  27.       AccCheck: integer;
  28.     end;
  29.  
  30.   PTransRep = ^TTransRep;
  31.   TTransRep =
  32.     object( TDialog)
  33.       CurrYr,
  34.       CurrMo: integer;
  35.  
  36.       constructor Init( AParent: PWindowsObject; ATitle, AccN: PChar; Last: boolean);
  37.       procedure SetupWindow; virtual;
  38.  
  39.       procedure Handle103( var Msg: TMessage); virtual id_First + 103;
  40.       function GetBalance( AccN: PChar): real; virtual;
  41.       function FillList: boolean; virtual;
  42.     end;
  43.  
  44.   PTransfer = ^TTransfer;
  45.   TTransfer =
  46.     object( TDialog)
  47.       RecN: integer;
  48.  
  49.       constructor Init( AParent: PWindowsObject; ATitle: PChar);
  50.       procedure OK( var Msg: TMessage); virtual id_First + id_OK;
  51.       function CanClose: boolean; virtual;
  52.       procedure SetupWindow; virtual;
  53.  
  54.       procedure FillCombo( Item: integer; Except: PChar); virtual;
  55.       function GetBalance( AccN: PChar): real; virtual;
  56.       procedure UpdateBalance; virtual;
  57.       procedure UpdateActivity; virtual;
  58.       procedure Handle101( var Msg: TMessage); virtual id_First + 101;
  59.       procedure Handle102( var Msg: TMessage); virtual id_First + 102;
  60.     end;
  61.  
  62.   PTransact = ^TTransact;
  63.   TTransact =
  64.     object( TDialog)
  65.       constructor Init( AParent: PWindowsObject; ATitle, AccN, AccT: PChar; M: boolean);
  66.       procedure SetupWindow; virtual;
  67.       function CanClose: boolean; virtual;
  68.       procedure OK( var Msg: TMessage); virtual id_First + id_OK;
  69.       procedure Cancel( var Msg: TMessage); virtual id_First + id_Cancel;
  70.  
  71.       procedure HandleTrans( var Msg: TMessage); virtual id_First + 103;
  72.       procedure HandleDate( var Msg: TMessage); virtual id_First + 104;
  73.       procedure HandleCheck( var Msg: TMessage); virtual id_First + 105;
  74.       procedure HandleCredit( var Msg: TMessage); virtual id_First + 106;
  75.       procedure HandleDebit( var Msg: TMessage); virtual id_First + 107;
  76.       procedure HandleNote( var Msg: TMessage); virtual id_First + 108;
  77.  
  78.       procedure GetAccountBalance; virtual;
  79.       procedure FillTransactCombo; virtual;
  80.       procedure ClearFields; virtual;
  81.       procedure UpdateActivity; virtual;
  82.       procedure UpdateBalance; virtual;
  83.     end;
  84.  
  85. implementation
  86.  
  87. const
  88.   AccFile = 'BANKACC.DTA';
  89.  
  90. const
  91.   ButtonMonth: array[1..12] of string[9] = ( 'January', 'February', 'March', 'April',
  92.                                              'May', 'June', 'July', 'August', 'September',
  93.                                              'October', 'November', 'December');
  94. const
  95.   Months: array[1..12] of string[3] = ( 'JAN', 'FEB', 'MAR', 'APR', 'MAY', 'JUN',
  96.                                         'JUL', 'AUG', 'SEP', 'OCT', 'NOV', 'DEC');
  97.  
  98. type
  99.   TransRec =
  100.     record
  101.       TransType: array[0..31] of char;
  102.     end;
  103.  
  104.   ActRec =
  105.     record
  106.       AccNum : array[0..20] of char;
  107.       Trans  : array[0..31] of char;
  108.       Credit : real;
  109.       Debit  : real;
  110.       Balance: real;
  111.       Check  : integer;
  112.       Date   : array[0..9] of char;
  113.       Notes  : array[0..66] of char;
  114.     end;
  115.  
  116. var
  117.   Activity,
  118.   GMulti : boolean;
  119.   GAccNum: array[0..20] of Char;
  120.   GAccT  : array[0..12] of char;
  121.   GAccBal: array[0..10] of Char;
  122.   PStr   : string[12];
  123.   AccF   : file of AccRec;
  124.   GAccR  : AccRec;
  125.   ActF   : file of ActRec;
  126.   GActR  : ActRec;
  127.   GCheck : integer;
  128.   GOldBal,
  129.   GNewBal: real;
  130.  
  131. { --------------------- }
  132. { TTransRep Methods:    }
  133. { --------------------- }
  134.  
  135. function TTransRep.GetBalance( AccN: PChar): real;
  136. begin
  137.   assign( AccF, AccFile);
  138.   reset( AccF);
  139.   repeat
  140.     read( AccF, GAccR);
  141.   until ( FilePos( AccF) = FileSize( AccF)) or ( StrComp( GAccR.AccNum, AccN) = 0);
  142.   if StrComp( GAccR.AccNum, AccN) = 0 then
  143.     GetBalance := GAccR.AccBal
  144.   else
  145.     GetBalance := 0.0;
  146.   close( AccF);
  147. end;
  148.  
  149. constructor TTransRep.Init( AParent: PWindowsObject; ATitle, AccN: PChar; Last: boolean);
  150. begin
  151.   TDialog.Init( AParent, ATitle);
  152.   StrCopy( GAccNum, AccN);
  153. end;
  154.  
  155. procedure TTransRep.SetupWindow;
  156. var
  157.   Yr,Mo,Dy,DW: word;
  158.   MStr       : PChar;
  159. begin
  160.   TDialog.SetupWindow;
  161.   GetDate( Yr, Mo, Dy, DW);
  162.   GetMem( MStr, 13);
  163.   StrPCopy( MStr, ButtonMonth[ Mo]);
  164.   SetDlgItemText( HWindow, 103, MStr);
  165.   SetDlgItemText( HWindow, 101, GAccNum);
  166.   str( GetBalance( GAccNum):0:2, PStr);
  167.   StrPCopy( MStr, PStr);
  168.   SetDlgItemText( HWindow, 102, MStr);
  169.   CurrMo := Mo;
  170.   CurrYr := Yr;
  171.   FreeMem( MStr, 13);
  172. end;
  173.  
  174. procedure TTransRep.Handle103( var Msg: TMessage);
  175. var
  176.   MStr : PChar;
  177. begin
  178.   if FillList then
  179.   begin
  180.     GetMem( MStr, 13);
  181.     CurrMo := CurrMo - 1;
  182.     StrPCopy( MStr, ButtonMonth[ CurrMo]);
  183.     SetDlgItemText( HWindow, 103, MStr);
  184.     FreeMem( MStr, 13);
  185.   end;
  186. end;
  187.  
  188. function TTransRep.FillList: boolean;
  189. var
  190.   Tmp : file of ActRec;
  191.   Mn  : string[3];
  192.   Yr  : string[2];
  193.   Mo,
  194.   Err: integer;
  195.   P,
  196.   Line: PChar;
  197. begin
  198.   FillList := TRUE;
  199.   Mn := Months[ CurrMo];
  200.   str( CurrYr, PStr);
  201.   Yr := copy( PStr, 3, 2);
  202.   assign( Tmp, Mn + Yr + '.DTA');
  203.   {$I-}
  204.   reset( Tmp);
  205.   {$I+}
  206.   if ioresult <> 0 then
  207.   begin
  208.     MessageBox( HWindow, 'No more transaction files', 'Transaction Reports',
  209.                 mb_IconStop or mb_OK);
  210.     FillList := FALSE;
  211.     exit;
  212.   end
  213.   else
  214.   begin
  215.     GetMem( P, 80);
  216.     GetMem( Line, 80);
  217.     SendDlgItemMsg( 104, lb_ResetContent, 0, 0);
  218.     repeat
  219.       read( Tmp, GActR);
  220.       if StrComp( GActR.AccNum, GAccNum) = 0 then
  221.       begin
  222.         StrCopy( Line, GActR.Date);
  223.         StrCat( Line, ' (');
  224.         StrCat( Line, GActR.Trans);
  225.         StrCat( Line, ') ');
  226.         StrCat( Line, GActR.Notes);
  227.         StrCat( Line, ' ');
  228.         if GActR.Debit <> 0.0 then
  229.         begin
  230.           str( -GActR.Debit:0:2, PStr);
  231.           StrPCopy( P, PStr);
  232.           StrCat( Line, P);
  233.           StrCat( Line, ' ');
  234.         end;
  235.         if GActR.Credit <> 0.0 then
  236.         begin
  237.           str( GActR.Credit:0:2, PStr);
  238.           StrPCopy( P, PStr);
  239.           StrCat( Line, P);
  240.           StrCat( Line, ' ');
  241.         end;
  242.         Err := SendDlgItemMsg( 104, lb_AddString, 0, longint( Line));
  243.       end;
  244.     until System.FilePos( Tmp) = System.FileSize( Tmp);
  245.     FreeMem( Line, 80);
  246.     FreeMem( P, 80);
  247.   end;
  248.   close( Tmp);
  249. end;
  250.  
  251. { --------------------- }
  252. { TTranfer Methods:     }
  253. { --------------------- }
  254.  
  255. procedure TTransfer.FillCombo( Item: integer; Except: PChar);
  256. var
  257.   Temp: PChar;
  258. begin
  259.   GetMem( Temp, 20);
  260.   assign( AccF, AccFile);
  261.   reset( AccF);
  262.   SendDlgItemMsg( Item, cb_ResetContent, 0, 0);
  263.   repeat
  264.     read( AccF, GAccR);
  265.     StrCopy( Temp, GAccR.AccNum);
  266.     if StrComp( Temp, Except) <> 0 then
  267.       SendDlgItemMsg( Item, cb_AddString, 0, longint( Temp));
  268.   until FilePos( AccF) = FileSize( AccF);
  269.   close( AccF);
  270.   GetDlgItemText( HWindow, Item, Temp, 20);
  271.   if StrLen( Temp) = 0 then
  272.     SendDlgItemMsg( Item, cb_SetCurSel, 0, 0);
  273.   FreeMem( Temp, 20);
  274. end;
  275.  
  276. function TTransfer.GetBalance( AccN: PChar): real;
  277. begin
  278.   assign( AccF, AccFile);
  279.   reset( AccF);
  280.   repeat
  281.     read( AccF, GAccR);
  282.   until ( FilePos( AccF) = FileSize( AccF)) or ( StrComp( GAccR.AccNum, AccN) = 0);
  283.   if StrComp( GAccR.AccNum, AccN) = 0 then
  284.   begin
  285.     GetBalance := GAccR.AccBal;
  286.     RecN := FilePos( AccF) - 1;
  287.   end
  288.   else
  289.   begin
  290.     GetBalance := 0.0;
  291.     RecN := 0;
  292.   end;
  293.   close( AccF);
  294. end;
  295.  
  296. procedure TTransfer.UpdateBalance;
  297. begin
  298.   assign( AccF, AccFile);
  299.   reset( AccF);
  300.   System.Seek( AccF, RecN);
  301.   read( AccF, GAccR);
  302.   GAccR.AccBal := GActR.Balance;
  303.   System.Seek( AccF, RecN);
  304.   write( AccF, GAccR);
  305.   close( AccF);
  306. end;
  307.  
  308. procedure TTransfer.UpdateActivity;
  309. var
  310.   Tmp : file of ActRec;
  311.   Mn  : string[3];
  312.   Yr  : string[2];
  313.   Mo,
  314.   Err: integer;
  315. begin
  316.   PStr := StrPas( GActR.Date);
  317.   val( copy( PStr, 1, 2), Mo, Err);
  318.   Mn := Months[ Mo];
  319.   Yr := copy( PStr, 7, 2);
  320.   assign( Tmp, Mn + Yr + '.DTA');
  321.   {$I-}
  322.   reset( Tmp);
  323.   {$I+}
  324.   if ioresult <> 0 then rewrite( Tmp)
  325.   else System.Seek( Tmp, FileSize( Tmp));
  326.   write( Tmp, GActR);
  327.   close( Tmp);
  328. end;
  329.  
  330. function TTransfer.CanClose: boolean;
  331. var
  332.   CC  : boolean;
  333.   Amnt: real;
  334.   Err,
  335.   FLen: integer;
  336.   Temp: PChar;
  337.   Date: array[0..9] of char;
  338. begin
  339.   CC := TDialog.CanClose;
  340.   if CC then
  341.   begin
  342.     GetMem( Temp, 10);
  343.     FLen := GetDlgItemText( HWindow, 103, Date, 9);
  344.     if FLen = 0 then
  345.     begin
  346.       MessageBox( HWindow, 'A transaction date is required in MM/DD/YY format',
  347.                   'Missing field', mb_IconStop or mb_OK);
  348.       FreeMem( Temp, 10);
  349.       CanClose := FALSE;
  350.       exit;
  351.     end;
  352.     FLen := GetDlgItemText( HWindow, 104, Temp, 10);
  353.     if FLen = 0 then
  354.     begin
  355.       MessageBox( HWindow, 'A transaction amount is required in 1234.56 format',
  356.                   'Missing field', mb_IconStop or mb_OK);
  357.       FreeMem( Temp, 10);
  358.       CanClose := FALSE;
  359.       exit;
  360.     end
  361.     else
  362.     begin
  363.       PStr := StrPas( Temp);
  364.       val( PStr, Amnt, Err);
  365.       if Err <> 0 then
  366.       begin
  367.         MessageBox( HWindow, 'Invalid transaction amount',
  368.                     'Invalid field', mb_IconStop or mb_OK);
  369.         FreeMem( Temp, 10);
  370.         CanClose := FALSE;
  371.         exit;
  372.       end;
  373.     end;
  374.     StrCopy( GActR.Date, Date);
  375.     GActR.Balance := Amnt;
  376.     FreeMem( Temp, 10);
  377.   end;
  378. end;
  379.  
  380. procedure TTransfer.OK( var Msg: TMessage);
  381. var
  382.   FromAcc,
  383.   ToAcc   : PChar;
  384.   Amnt    : real;
  385. begin
  386.   if CanClose then
  387.   begin
  388.     GetMem( FromAcc, 20);
  389.     GetMem( ToAcc, 20);
  390.     Amnt := GActR.Balance;
  391.     GetDlgItemText( HWindow, 101, FromAcc, 20);
  392.     GetDlgItemText( HWindow, 102, ToAcc, 20);
  393.  
  394.     StrCopy( GActR.Trans, 'Transfer');
  395.     StrCopy( GActR.AccNum, FromAcc);
  396.     GActR.Credit := 0.0;
  397.     GActR.Debit := Amnt;
  398.     GActR.Balance := GetBalance( FromAcc) - Amnt;
  399.     StrCopy( GActR.Notes, 'To ');
  400.     StrCat( GActR.Notes, ToAcc);
  401.     UpdateActivity;
  402.     UpdateBalance;
  403.  
  404.     StrCopy( GActR.AccNum, ToAcc);
  405.     GActR.Credit := Amnt;
  406.     GActR.Debit := 0.0;
  407.     GActR.Balance := GetBalance( ToAcc) + Amnt;
  408.     StrCopy( GActR.Notes, 'From ');
  409.     StrCat( GActR.Notes, FromAcc);
  410.     UpdateActivity;
  411.     UpdateBalance;
  412.  
  413.     FreeMem( FromAcc, 20);
  414.     FreeMem( ToAcc, 20);
  415.  
  416.     EndDialog( HWindow, id_OK);
  417.   end;
  418. end;
  419.  
  420. constructor TTransfer.Init( AParent: PWindowsObject; ATitle: PChar);
  421. begin
  422.   TDialog.Init( AParent, ATitle);
  423. end;
  424.  
  425. procedure TTransfer.SetupWindow;
  426. begin
  427.   TDialog.SetupWindow;
  428.   FillCombo( 101, '');
  429.   FillCombo( 102, '');
  430. end;
  431.  
  432. procedure TTransfer.Handle101( var Msg: TMessage);
  433. var
  434.   AccN: PChar;
  435. begin
  436.   if Msg.LParamHi = cbn_Killfocus then
  437.   begin
  438.     GetMem( AccN, 20);
  439.     GetDlgItemText( HWindow, 101, AccN, 20);
  440.     FillCombo( 102, AccN);
  441.     FreeMem( AccN, 20);
  442.   end;
  443. end;
  444.  
  445. procedure TTransfer.Handle102( var Msg: TMessage);
  446. var
  447.   AccN: PChar;
  448. begin
  449.   if Msg.LParamHi = cbn_Killfocus then
  450.   begin
  451.     GetMem( AccN, 20);
  452.     GetDlgItemText( HWindow, 102, AccN, 20);
  453.     FillCombo( 101, AccN);
  454.     FreeMem( AccN, 20);
  455.   end;
  456. end;
  457.  
  458. { --------------------- }
  459. { TTransact Methods:    }
  460. { --------------------- }
  461.  
  462. constructor TTransact.Init( AParent: PWindowsObject; ATitle, AccN, AccT: PChar; M: boolean);
  463. begin
  464.   TDialog.Init( AParent, ATitle);
  465.   StrCopy( GAccNum, AccN);
  466.   StrCopy( GAccT, AccT);
  467.   GMulti := M;
  468. end;
  469.  
  470. procedure TTransact.SetupWindow;
  471. begin
  472.   TDialog.SetupWindow;
  473.  
  474.   assign( ActF, 'BANKACT.DTA');
  475.   rewrite( ActF);
  476.   Activity := FALSE;
  477.  
  478.   GetAccountBalance;
  479.   SetDlgItemText( HWindow, 101, GAccNum);
  480.   SetDlgItemText( HWindow, 102, GAccBal);
  481.   FillTransactCombo;
  482. end;
  483.  
  484. function TTransact.CanClose: boolean;
  485. var
  486.   FErr,
  487.   CC  : boolean;
  488.   FLen: integer;
  489.   TmpC: array[0..10] of char;
  490. begin
  491.   CC := TDialog.CanClose;
  492.   CanClose := CC;
  493.   if CC then
  494.   begin
  495.     FErr := FALSE;
  496.     FLen := GetDlgItemText( HWindow, 104, TmpC, 9);
  497.     if FLen = 0 then
  498.     begin
  499.       MessageBox( HWindow, 'Each transaction must have a date',
  500.                   'Missing field', mb_IConStop or mb_OK);
  501.       FErr := TRUE;
  502.     end;
  503.     FLen := GetDlgItemText( HWindow, 106, TmpC, 10);
  504.     if FLen = 0 then
  505.     begin
  506.       FLen := GetDlgItemText( HWindow, 107, TmpC, 10);
  507.       if FLen = 0 then
  508.       begin
  509.         MessageBox( HWindow, 'Each transaction must have a credit or debit amount',
  510.                     'Missing field', mb_IConStop or mb_OK);
  511.         FErr := TRUE;
  512.       end;
  513.     end;
  514.     if not FErr then CC := TRUE;
  515.   end;
  516.   CanClose := CC;
  517. end;
  518.  
  519. procedure TTransact.OK( var Msg: TMessage);
  520. var
  521.   CC  : boolean;
  522.   ActR: ActRec;
  523.   TmpC: array[0..10] of Char;
  524. begin
  525.   CC := CanClose;
  526.   if CC then
  527.   begin
  528.     GOldBal := GNewBal;
  529.  
  530.     StrCopy( GActR.AccNum, GAccNum);
  531.     GetDlgItemText( HWindow, 103, GActR.Trans, 31);
  532.     GActR.Balance := GNewBal;
  533.     if GetDlgItemText( HWindow, 105, TmpC, 6) > 0 then
  534.     begin
  535.       GActR.Check := GCheck;
  536.       inc( GCheck);
  537.     end
  538.     else GActR.Check := 0;
  539.     write( ActF, GActR);
  540.     Activity := TRUE;
  541.   end;
  542.   if not GMulti then
  543.   begin
  544.     if CC then
  545.     begin
  546.       close( ActF);
  547.       UpdateActivity;
  548.       UpdateBalance;
  549.       EndDialog( HWindow, id_OK);
  550.     end;
  551.   end
  552.   else ClearFields;
  553. end;
  554.  
  555. procedure TTransact.Cancel( var Msg: TMessage);
  556. begin
  557.   if GMulti and Activity then
  558.   begin
  559.     close( ActF);
  560.     if MessageBox( HWindow, 'There have been changes. Save them?',
  561.       'Transaction Entries', mb_IConQuestion or mb_YesNo) = id_Yes then
  562.     begin
  563.       UpdateActivity;
  564.       UpdateBalance;
  565.     end
  566.     else erase( ActF);
  567.   end
  568.   else erase( ActF);
  569.   EndDialog( HWindow, id_Cancel);
  570. end;
  571.  
  572. procedure TTransact.GetAccountBalance;
  573. begin
  574.   assign( AccF, 'BANKACC.DTA');
  575.   reset( AccF);
  576.   repeat
  577.     read( AccF, GAccR);
  578.   until ( StrComp( GAccR.AccNum, GAccNum) = 0);
  579.   close( AccF);
  580.   str( GAccR.AccBal:0:2, PStr);
  581.   StrPCopy( GAccBal, PStr);
  582.   GCheck := GAccR.AccCheck;
  583.   GOldBal := GAccR.AccBal;
  584. end;
  585.  
  586. procedure TTransact.UpdateActivity;
  587. const
  588.   Months: array[1..12] of string[3] = ( 'JAN', 'FEB', 'MAR', 'APR', 'MAY', 'JUN',
  589.                                         'JUL', 'AUG', 'SEP', 'OCT', 'NOV', 'DEC');
  590. var
  591.   Tmp : file of ActRec;
  592.   Mn  : string[3];
  593.   Yr  : string[2];
  594.   Mo,
  595.   Err: integer;
  596. begin
  597.   assign( ActF, 'BANKACT.DTA');
  598.   reset( ActF);
  599.   repeat
  600.     read( ActF, GActR);
  601.     PStr := StrPas( GActR.Date);
  602.     val( copy( PStr, 1, 2), Mo, Err);
  603.     Mn := Months[ Mo];
  604.     Yr := copy( PStr, 7, 2);
  605.     assign( Tmp, Mn + Yr + '.DTA');
  606.     {$I-}
  607.     reset( Tmp);
  608.     {$I+}
  609.     if ioresult <> 0 then rewrite( Tmp)
  610.     else System.Seek( Tmp, FileSize( Tmp));
  611.     write( Tmp, GActR);
  612.     close( Tmp);
  613.   until FilePos( ActF) = FileSize( ActF);
  614.   close( ActF);
  615.   erase( ActF);
  616. end;
  617.  
  618. procedure TTransact.UpdateBalance;
  619. begin
  620.   assign( AccF, 'BANKACC.DTA');
  621.   reset( AccF);
  622.   repeat
  623.     read( AccF, GAccR);
  624.   until ( StrComp( GAccR.AccNum, GAccNum) = 0);
  625.   seek( AccF, FilePos( AccF) - 1);
  626.   GAccR.AccBal := GNewBal;
  627.   GAccR.AccCheck := GCheck;
  628.   write( AccF, GAccR);
  629.   close( AccF);
  630. end;
  631.  
  632. procedure TTransact.FillTransactCombo;
  633. var
  634.   TrnF  : file of TransRec;
  635.   TrnR  : TransRec;
  636.   Temp  : PChar;
  637.   MiscIx: integer;
  638. begin
  639.   GetMem( Temp, 31);
  640.   assign( TrnF, 'BANKTRN.DTA');
  641.   {$I-}
  642.   reset( TrnF);
  643.   {$I+}
  644.   if ioresult = 0 then
  645.   begin
  646.     repeat
  647.       read( TrnF, TrnR);
  648.       StrCopy( Temp, TrnR.TransType);
  649.       SendDlgItemMsg( 103, cb_AddString, 0, longint( Temp));
  650.     until FilePos( TrnF) = FileSize( TrnF);
  651.   end
  652.   else
  653.   begin
  654.     rewrite( TrnF);
  655.     Temp := 'Gas';
  656.     SendDlgItemMsg( 103, cb_AddString, 0, longint( Temp));
  657.     StrCopy( TrnR.TransType, Temp);
  658.     write( TrnF, TrnR);
  659.  
  660.     Temp := 'Groceries';
  661.     SendDlgItemMsg( 103, cb_AddString, 0, longint( Temp));
  662.     StrCopy( TrnR.TransType, Temp);
  663.     write( TrnF, TrnR);
  664.  
  665.     Temp := 'Living expenses';
  666.     SendDlgItemMsg( 103, cb_AddString, 0, longint( Temp));
  667.     StrCopy( TrnR.TransType, Temp);
  668.     write( TrnF, TrnR);
  669.  
  670.     Temp := 'Loan';
  671.     SendDlgItemMsg( 103, cb_AddString, 0, longint( Temp));
  672.     StrCopy( TrnR.TransType, Temp);
  673.     write( TrnF, TrnR);
  674.  
  675.     Temp := 'Miscellaneous';
  676.     SendDlgItemMsg( 103, cb_AddString, 0, longint( Temp));
  677.     StrCopy( TrnR.TransType, Temp);
  678.     write( TrnF, TrnR);
  679.  
  680.     Temp := 'Utilities';
  681.     SendDlgItemMsg( 103, cb_AddString, 0, longint( Temp));
  682.     StrCopy( TrnR.TransType, Temp);
  683.     write( TrnF, TrnR);
  684.   end;
  685.   close( TrnF);
  686.   if StrComp( GAccT, 'Loan') <> 0 then
  687.   begin
  688.     Temp := 'Miscellaneous';
  689.     MiscIx := SendDlgItemMsg( 103, cb_FindString, 1, longint( Temp));
  690.     SendDlgItemMsg( 103, cb_SetCurSel, MiscIx, 0);
  691.   end
  692.   else
  693.   begin
  694.     SendDlgItemMsg( 103, cb_ResetContent, 0, 0);
  695.     Temp := 'Loan';
  696.     SendDlgItemMsg( 103, cb_AddString, 0, longint( Temp));
  697.     SendDlgItemMsg( 103, cb_SetCurSel, 0, 0);
  698.   end;
  699. end;
  700.  
  701. procedure TTransact.ClearFields;
  702. begin
  703.   SetDlgItemText( HWindow, 104, PChar( 0));
  704.   SetDlgItemText( HWindow, 105, PChar( 0));
  705.   SetDlgItemText( HWindow, 106, PChar( 0));
  706.   SetDlgItemText( HWindow, 107, PChar( 0));
  707.   SetDlgItemText( HWindow, 108, PChar( 0));
  708. end;
  709.  
  710. procedure TTransact.HandleTrans( var Msg: TMessage);
  711. var
  712.   TrnF  : file of TransRec;
  713.   TrnR  : TransRec;
  714.   Trans: array[0..31] of char;
  715.   WTransF,
  716.   FLen : integer;
  717.   Temp : PChar;
  718. begin
  719.   if Msg.LParamHi = cbn_KillFocus then
  720.   begin
  721.     FLen := GetDlgItemText( HWindow, 103, Trans, 31);
  722.     if FLen > 0 then
  723.     begin
  724.       GetMem( Temp, 31);
  725.       StrCopy( Temp, Trans);
  726.       if SendDlgItemMsg( 103, cb_FindString, 1, longInt( Temp)) = cb_Err then
  727.       begin
  728.         assign( TrnF, 'BANKTRN.DTA');
  729.         reset( TrnF);
  730.         seek( TrnF, FileSize( TrnF));
  731.         StrCopy( TrnR.TransType, Trans);
  732.         write( TrnF, TrnR);
  733.         close( TrnF);
  734.         StrCopy( Temp, Trans);
  735.         SendDlgItemMsg( 103, cb_AddString, 0, longint( Temp));
  736.       end;
  737.       FreeMem( Temp, 31);
  738.     end;
  739.   end;
  740. end;
  741.  
  742. procedure TTransact.HandleDate( var Msg: TMessage);
  743. var
  744.   Date: array[0..9] of char;
  745.   FLen: integer;
  746. begin
  747.   if Msg.LParamHi = en_KillFocus then
  748.   begin
  749.     FLen := GetDlgItemText( HWindow, 104, Date, 9);
  750.     if ( FLen > 0) and ( FLen <> 8) then
  751.       MessageBox( HWindow, 'Dates should have the MM/DD/YY format, such as 05/31/90',
  752.                   'Field format', mb_IconInformation or mb_OK)
  753.     else if FLen = 8 then
  754.       StrCopy( GActR.Date, Date);
  755.   end
  756.   else DefWndProc( Msg);
  757. end;
  758.  
  759. procedure TTransact.HandleCheck( var Msg: TMessage);
  760. var
  761.   Check : array[0..6] of char;
  762.   CheckN,
  763.   Err,
  764.   FLen  : integer;
  765. begin
  766.   if Msg.LParamHi = en_SetFocus then
  767.   begin
  768.     FLen := GetDlgItemText( HWindow, 105, Check, 6);
  769.     if FLen = 0 then
  770.     begin
  771.       str( GCheck, PStr);
  772.       StrPCopy( Check, PStr);
  773.       SetDlgItemText( HWindow, 105, Check);
  774.     end;
  775.   end
  776.   else if Msg.LParamHi = en_KillFocus then
  777.   begin
  778.     FLen := GetDlgItemText( HWindow, 105, Check, 6);
  779.     if FLen <> 0 then
  780.     begin
  781.       val( Check, CheckN, Err);
  782.       if Err <> 0 then
  783.         MessageBox( HWindow, 'A numeric check number is expected, such as 1234',
  784.                     'Field format', mb_IconInformation or mb_OK)
  785.       else
  786.         GCheck := CheckN;
  787.     end;
  788.   end
  789.   else DefWndProc( Msg);
  790. end;
  791.  
  792. procedure TTransact.HandleCredit( var Msg: TMessage);
  793. var
  794.   Credit: array[0..10] of char;
  795.   Amnt  : real;
  796.   Err,
  797.   FLen  : integer;
  798. begin
  799.   if Msg.LParamHi = en_KillFocus then
  800.   begin
  801.     FLen := GetDlgItemText( HWindow, 106, Credit, 10);
  802.     if FLen > 0 then
  803.     begin
  804.       PStr := StrPas( Credit);
  805.       val( PStr, Amnt, Err);
  806.       if Err <> 0 then
  807.         MessageBox( HWindow, 'The credit/deposit amount must be numeric, such as 100.95',
  808.                     'Field format', mb_IconInformation or mb_OK)
  809.       else
  810.       begin
  811.         GActR.Credit := Amnt;
  812.         GActR.Debit := 0.0;
  813.         GNewBal := GOldBal + Amnt;
  814.         str( GNewBal:0:2, PStr);
  815.         StrPCopy( GAccBal, PStr);
  816.         SetDlgItemText( HWindow, 102, GAccBal);
  817.       end;
  818.     end;
  819.   end
  820.   else DefWndProc( Msg);
  821. end;
  822.  
  823. procedure TTransact.HandleDebit( var Msg: TMessage);
  824. var
  825.   Debit : array[0..10] of char;
  826.   Amnt  : real;
  827.   Err,
  828.   FLen  : integer;
  829. begin
  830.   if Msg.LParamHi = en_KillFocus then
  831.   begin
  832.     FLen := GetDlgItemText( HWindow, 107, Debit, 10);
  833.     if FLen > 0 then
  834.     begin
  835.       PStr := StrPas( Debit);
  836.       val( PStr, Amnt, Err);
  837.       if Err <> 0 then
  838.         MessageBox( HWindow, 'The debit/withdraw amount must be numeric, such as 1500.95',
  839.                     'Field format', mb_IconInformation or mb_OK)
  840.       else
  841.       begin
  842.         GActR.Debit := Amnt;
  843.         GActR.Credit := 0.0;
  844.         GNewBal := GOldBal - Amnt;
  845.         str( GNewBal:0:2, PStr);
  846.         StrPCopy( GAccBal, PStr);
  847.         SetDlgItemText( HWindow, 102, GAccBal);
  848.       end;
  849.     end;
  850.   end
  851.   else DefWndProc( Msg);
  852. end;
  853.  
  854. procedure TTransact.HandleNote( var Msg: TMessage);
  855. var
  856.   N     : array[0..66] of char;
  857.   FLen  : integer;
  858. begin
  859.   if Msg.LParamHi = en_KillFocus then
  860.   begin
  861.     FLen := GetDlgItemText( HWindow, 108, N, 66);
  862.     if FLen > 0 then
  863.       StrCopy( GActR.Notes, N);
  864.   end;
  865. end;
  866.  
  867. end.